﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Schema;
using System.Xml.Serialization;
using DocumentFormat.OpenXml.Packaging;

namespace TISS_Add_in
{
    static class XMLUtils
    {
        public static string NamespaceANS = "http://www.ans.gov.br/padroes/tiss/schemas";
        
        /// <summary>
        /// Gets the inner XML of the xDoc parameter, removing the optional nodes if they are empty
        /// </summary>
        /// <param name="xDoc">The XMLDocument that needs to be normalized</param>
        /// <param name="tipoGuia">The type of the Guia</param>
        /// <returns>A String with the XML syntax without optional nodes that were empty</returns>
        /// 
        public static string GetNormalizedXMLString(XmlDocument xDoc)
        {
            XmlNamespaceManager nsManager = new XmlNamespaceManager(xDoc.NameTable);
            nsManager.AddNamespace("ans", "http://www.ans.gov.br/padroes/tiss/schemas");

            XmlNodeList nodes = xDoc.LastChild.ChildNodes;

            for (int i = nodes.Count - 1; i >= 0; i--)
            {
                RemoveChildNodesIfEmpty(nodes[i]);
            }

            return xDoc.InnerXml;
            
        }

        private static void RemoveChildNodesIfEmpty(this XmlNode node)
        {
            if (node.HasChildNodes)
            {
                for (int i = node.ChildNodes.Count - 1; i >= 0; i--)
                    RemoveChildNodesIfEmpty(node.ChildNodes[i]);
                if (!node.HasChildNodes)
                    node.ParentNode.RemoveChild(node);
            }
            else if ((node.InnerXml == "" || node.InnerXml == null) && (node.Value == "" || node.Value == null))
                node.ParentNode.RemoveChild(node);
            
            
        }

        public static List<ValidationInfo> ValidateGuia(string XMLString, TipoGuia tipoGuia)
        {
            List<ValidationInfo> itemList = new List<ValidationInfo>();

            string schemaPath = "";

            switch (tipoGuia)
            {
                case TipoGuia.Consulta:
                    schemaPath = AppDomain.CurrentDomain.BaseDirectory + "\\schemas\\guiaConsulta.xsd";
                    break;
                case TipoGuia.SP_SADT:
                    schemaPath = AppDomain.CurrentDomain.BaseDirectory + "\\schemas\\guiaSP_SADT.xsd";
                    break;
                case TipoGuia.Resumo_Internação:
                    schemaPath = AppDomain.CurrentDomain.BaseDirectory + "\\schemas\\guiaResumoInternacao.xsd";
                    break;
                case TipoGuia.Honorário_Individual:
                    schemaPath = AppDomain.CurrentDomain.BaseDirectory + "\\schemas\\guiaHonorarioIndividual.xsd";
                    break;
                case TipoGuia.Odontologia:
                    schemaPath = AppDomain.CurrentDomain.BaseDirectory + "\\schemas\\guiaOdontologia.xsd";
                    break;
                case TipoGuia.Consulta_Reapresentação:
                    schemaPath = AppDomain.CurrentDomain.BaseDirectory + "\\schemas\\guiaConsultaReapresentacao.xsd";
                    break;
                case TipoGuia.SP_SADT_Reapresentação:
                    schemaPath = AppDomain.CurrentDomain.BaseDirectory + "\\schemas\\guiaSP_SADTReapresentacao.xsd";
                    break;
                case TipoGuia.Resumo_Internação_Reapresentação:
                    schemaPath = AppDomain.CurrentDomain.BaseDirectory + "\\schemas\\guiaResumoInternacaoReapresentacao.xsd";
                    break;
                case TipoGuia.Honorário_Individual_Reapresentação:
                    schemaPath = AppDomain.CurrentDomain.BaseDirectory + "\\schemas\\guiaHonorarioIndividualReapresentacao.xsd";
                    break;
                case TipoGuia.Odontologia_Reapresentação:
                    schemaPath = AppDomain.CurrentDomain.BaseDirectory + "\\schemas\\guiaOdontologiaReapresentacao.xsd";
                    break;
                case TipoGuia.Solicitação_Internação:
                    schemaPath = AppDomain.CurrentDomain.BaseDirectory + "\\schemas\\guiaSolicInternacao.xsd";
                    break;
                case TipoGuia.Solicitação_Prorrogação:
                    schemaPath = AppDomain.CurrentDomain.BaseDirectory + "\\schemas\\guiaSolicitacaoProrrogacao.xsd";
                    break;
                case TipoGuia.Solicitação_SADT:
                    schemaPath = AppDomain.CurrentDomain.BaseDirectory + "\\schemas\\guiaSolicitacaoSP_SADT.xsd";
                    break;
                case TipoGuia.Solicitação_Odontologia:
                    schemaPath = AppDomain.CurrentDomain.BaseDirectory + "\\schemas\\guiaSolicitacaoOdonto.xsd";
                    break;
                case TipoGuia.Outras_Despesas:
                    schemaPath = AppDomain.CurrentDomain.BaseDirectory + "\\schemas\\outrasDespesas.xsd";
                    break;
            }

            XmlReader schemaReader = XmlReader.Create(schemaPath);
            XmlSchemaSet schemaSet = new XmlSchemaSet();
            XmlSchema schema = XmlSchema.Read(schemaReader, null);
            schemaSet.Add(schema);

            CultureInfo OldCulture = Thread.CurrentThread.CurrentCulture;
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");

            XDocument xDoc = XDocument.Parse(XMLString);
            xDoc.Validate(schemaSet, (o, e) =>
            {
                string[] Erro = e.Message.Replace(" ", "").Split('\'', '.');
                string campo = "", msg = "";

                if (Erro.Contains("isinvalidaccordingtoitsdatatype"))
                {
                    campo = Erro[4].Substring(Erro[4].LastIndexOf(':') + 1);
                    msg = "O valor '" + Erro[6] + "' é inválido";
                }
                else if (Erro.Contains("Listofpossibleelementsexpected:"))
                {
                    int pos = e.Message.Substring(0, e.Message.LastIndexOf(':') - 1).LastIndexOf(":") + 3;
                    campo = e.Message.Substring(pos, e.Message.LastIndexOf("in") - pos - 2);
                    msg = "É Obrigatório o Preenchimento deste(s) Campo(s)";
                }

                campo = campo.Insert(0, campo[0].ToString().ToUpper());
                campo = campo.Remove(1,1);
                bool possivelSigla = true;

                for (int i = campo.Length -1; i > 0 ; i--)
                {
                    if (!possivelSigla)
                    {
                        if ((campo[i].ToString() == campo[i].ToString().ToUpper()))
                        {
                            campo = campo.Insert(i, " ");
                            possivelSigla = true;
                        }
                        else if (campo[i - 1].ToString() == " ")
                        {
                            campo = campo.Insert(i, campo[i].ToString().ToUpper());
                            campo = campo.Remove(i + 1, 1);
                        }
                    }
                    else
                    {
                        if (campo[i].ToString() != campo[i].ToString().ToUpper())
                        {
                            possivelSigla = false;
                        }
                        //Fim da Sigla??
                        else if (campo[i - 1].ToString() != campo[i - 1].ToString().ToUpper())
                        {
                            possivelSigla = false;
                            campo = campo.Insert(i, " ");
                        }
                    }
                }
                itemList.Add(new ValidationInfo(e, campo, msg));

            });

            Thread.CurrentThread.CurrentCulture = OldCulture;
            Thread.CurrentThread.CurrentUICulture = OldCulture;

            return itemList;
        }

        private static string[] GetSiblingsNames (this XmlNode node)
        {
            List<string> siblings = new List<string>();
            XmlNode previousSibling = node.PreviousSibling;

            siblings.Add(node.Name);
            
            while (previousSibling != null)
            {
                siblings.Add(previousSibling.Name);
                previousSibling = previousSibling.PreviousSibling;
            }

            while (node.NextSibling != null)
            {
                siblings.Add(node.NextSibling.Name);
                node = node.NextSibling;
            }

            return siblings.ToArray<string>();
        }

        public static XmlElement RenameElement(XmlElement e, string newName)
        {
            XmlDocument doc = e.OwnerDocument;
            XmlElement newElement = doc.CreateElement(newName);
            while (e.HasChildNodes)
            {
                newElement.AppendChild(e.FirstChild);
            }
            XmlAttributeCollection ac = e.Attributes;
            while (ac.Count > 0)
            {
                newElement.Attributes.Append(ac[0]);
            }
            XmlNode parent = e.ParentNode;
            parent.ReplaceChild(newElement, e);
            return newElement;
        }

        public static XElement RenameElement(XElement e, string newName, XNamespace ns)
        {
            XElement newElement = new XElement(ns + newName);
            if (e.HasAttributes)
            {
                IEnumerable<XAttribute> atributos = e.Attributes();
                foreach (var atributo in atributos)
                {
                    newElement.Add(new XAttribute(atributo));
                }
            }
            newElement.Add(e.Elements());
            return newElement;
        }

        public static XmlNode RenameNode(XmlNode e, string newName)
        {
            XmlDocument doc = e.OwnerDocument;
            XmlNode newElement = doc.CreateNode(XmlNodeType.Element,"ans", newName, "http://www.ans.gov.br/padroes/tiss/schemas");
            while (e.HasChildNodes)
            {
                newElement.AppendChild(e.FirstChild);
            }
            XmlAttributeCollection ac = e.Attributes;
            while (ac.Count > 0)
            {
                newElement.Attributes.Append(ac[0]);
            }
            XmlNode parent = e.ParentNode;
            parent.ReplaceChild(newElement, e);
            return newElement;
        }

        public static XmlDocument SubstituiCustomControlXmlMapping(TipoGuia tipoGuia, XmlDocument xmlMainDoc, TipoCustomControlXmlMapping tipoCustomControlNovo, TipoProfissional tipoProfissional)
        {
            XmlNamespaceManager nsManager = new XmlNamespaceManager(xmlMainDoc.NameTable);
            nsManager.AddNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");

            string xPathAntigo = "";
            string xPathNovo = "";

            #region xPath
            switch (tipoGuia)
            {
                case TipoGuia.Consulta:
                    if (xmlMainDoc.InnerXml.Contains("/ns0:guiaConsulta[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:CPF[1]"))
                        xPathAntigo = "/ns0:guiaConsulta[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:CPF[1]";
                    else if (xmlMainDoc.InnerXml.Contains("/ns0:guiaConsulta[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:CNPJ[1]"))
                        xPathAntigo = "/ns0:guiaConsulta[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                    else if (xmlMainDoc.InnerXml.Contains("/ns0:guiaConsulta[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]"))
                        xPathAntigo = "/ns0:guiaConsulta[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";

                    switch (tipoCustomControlNovo)
                    {
                        case TipoCustomControlXmlMapping.CPF:
                            xPathNovo = "/ns0:guiaConsulta[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:CPF[1]";
                            break;
                        case TipoCustomControlXmlMapping.CNPJ:
                            xPathNovo = "/ns0:guiaConsulta[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                            break;
                        case TipoCustomControlXmlMapping.CodigoPrestadorNaOperadora:
                            xPathNovo = "/ns0:guiaConsulta[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";
                            break;
                    }
                    break;
                case TipoGuia.SP_SADT:
                    switch (tipoProfissional)
                    {
                        case TipoProfissional.ProfissionalSolicitante:
                            if (xmlMainDoc.InnerXml.Contains("/ns0:guiaSP_SADT[1]/ns0:dadosSolicitante[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:CPF[1]"))
                                xPathAntigo = "/ns0:guiaSP_SADT[1]/ns0:dadosSolicitante[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:CPF[1]";
                            else if (xmlMainDoc.InnerXml.Contains("/ns0:guiaSP_SADT[1]/ns0:dadosSolicitante[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:CNPJ[1]"))
                                xPathAntigo = "/ns0:guiaSP_SADT[1]/ns0:dadosSolicitante[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                            else if (xmlMainDoc.InnerXml.Contains("/ns0:guiaSP_SADT[1]/ns0:dadosSolicitante[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]"))
                                xPathAntigo = "/ns0:guiaSP_SADT[1]/ns0:dadosSolicitante[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";

                            switch (tipoCustomControlNovo)
                            {
                                case TipoCustomControlXmlMapping.CPF:
                                    xPathNovo = "/ns0:guiaSP_SADT[1]/ns0:dadosSolicitante[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:CPF[1]";
                                    break;
                                case TipoCustomControlXmlMapping.CNPJ:
                                    xPathNovo = "/ns0:guiaSP_SADT[1]/ns0:dadosSolicitante[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                                    break;
                                case TipoCustomControlXmlMapping.CodigoPrestadorNaOperadora:
                                    xPathNovo = "/ns0:guiaSP_SADT[1]/ns0:dadosSolicitante[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";
                                    break;
                            }
                            break;
                        case TipoProfissional.ProfissionalExecutante:
                            if (xmlMainDoc.InnerXml.Contains("/ns0:guiaSP_SADT[1]/ns0:prestadorExecutante[1]/ns0:identificacao[1]/ns0:CPF[1]"))
                                xPathAntigo = "/ns0:guiaSP_SADT[1]/ns0:prestadorExecutante[1]/ns0:identificacao[1]/ns0:CPF[1]";
                            else if (xmlMainDoc.InnerXml.Contains("/ns0:guiaSP_SADT[1]/ns0:prestadorExecutante[1]/ns0:identificacao[1]/ns0:CNPJ[1]"))
                                xPathAntigo = "/ns0:guiaSP_SADT[1]/ns0:prestadorExecutante[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                            else if (xmlMainDoc.InnerXml.Contains("/ns0:guiaSP_SADT[1]/ns0:prestadorExecutante[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]"))
                                xPathAntigo = "/ns0:guiaSP_SADT[1]/ns0:prestadorExecutante[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";

                            switch (tipoCustomControlNovo)
                            {
                                case TipoCustomControlXmlMapping.CPF:
                                    xPathNovo = "/ns0:guiaSP_SADT[1]/ns0:prestadorExecutante[1]/ns0:identificacao[1]/ns0:CPF[1]";
                                    break;
                                case TipoCustomControlXmlMapping.CNPJ:
                                    xPathNovo = "/ns0:guiaSP_SADT[1]/ns0:prestadorExecutante[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                                    break;
                                case TipoCustomControlXmlMapping.CodigoPrestadorNaOperadora:
                                    xPathNovo = "/ns0:guiaSP_SADT[1]/ns0:prestadorExecutante[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";
                                    break;
                            }
                            break;
                        default:
                            throw new Exception();
                    }
                    break;
                case TipoGuia.Resumo_Internação:
                    if (xmlMainDoc.InnerXml.Contains("/ns0:guiaResumoInternacao[1]/ns0:identificacaoExecutante[1]/ns0:identificacao[1]/ns0:CPF[1]"))
                        xPathAntigo = "/ns0:guiaResumoInternacao[1]/ns0:identificacaoExecutante[1]/ns0:identificacao[1]/ns0:CPF[1]";
                    else if (xmlMainDoc.InnerXml.Contains("/ns0:guiaResumoInternacao[1]/ns0:identificacaoExecutante[1]/ns0:identificacao[1]/ns0:CNPJ[1]"))
                        xPathAntigo = "/ns0:guiaResumoInternacao[1]/ns0:identificacaoExecutante[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                    else if (xmlMainDoc.InnerXml.Contains("/ns0:guiaResumoInternacao[1]/ns0:identificacaoExecutante[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]"))
                        xPathAntigo = "/ns0:guiaResumoInternacao[1]/ns0:identificacaoExecutante[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";

                    switch (tipoCustomControlNovo)
                    {
                        case TipoCustomControlXmlMapping.CPF:
                            xPathNovo = "/ns0:guiaResumoInternacao[1]/ns0:identificacaoExecutante[1]/ns0:identificacao[1]/ns0:CPF[1]";
                            break;
                        case TipoCustomControlXmlMapping.CNPJ:
                            xPathNovo = "/ns0:guiaResumoInternacao[1]/ns0:identificacaoExecutante[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                            break;
                        case TipoCustomControlXmlMapping.CodigoPrestadorNaOperadora:
                            xPathNovo = "/ns0:guiaResumoInternacao[1]/ns0:identificacaoExecutante[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";
                            break;
                    }
                    break;
                case TipoGuia.Honorário_Individual:
                    switch (tipoProfissional)
                    {
                        case TipoProfissional.ProfissionalSolicitante:
                            if (xmlMainDoc.InnerXml.Contains("/ns0:guiaHonorarioIndividual[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:CPF[1]"))
                                xPathAntigo = "/ns0:guiaHonorarioIndividual[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:CPF[1]";
                            else if (xmlMainDoc.InnerXml.Contains("/ns0:guiaHonorarioIndividual[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:CNPJ[1]"))
                                xPathAntigo = "/ns0:guiaHonorarioIndividual[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                            else if (xmlMainDoc.InnerXml.Contains("/ns0:guiaHonorarioIndividual[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]"))
                                xPathAntigo = "/ns0:guiaHonorarioIndividual[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";

                            switch (tipoCustomControlNovo)
                            {
                                case TipoCustomControlXmlMapping.CPF:
                                    xPathNovo = "/ns0:guiaHonorarioIndividual[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:CPF[1]";
                                    break;
                                case TipoCustomControlXmlMapping.CNPJ:
                                    xPathNovo = "/ns0:guiaHonorarioIndividual[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                                    break;
                                case TipoCustomControlXmlMapping.CodigoPrestadorNaOperadora:
                                    xPathNovo = "/ns0:guiaHonorarioIndividual[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";
                                    break;
                            }
                            break;
                        case TipoProfissional.ProfissionalExecutante:
                            if (xmlMainDoc.InnerXml.Contains("/ns0:guiaHonorarioIndividual[1]/ns0:contratadoExecutante[1]/ns0:identificacao[1]/ns0:CPF[1]"))
                                xPathAntigo = "/ns0:guiaHonorarioIndividual[1]/ns0:contratadoExecutante[1]/ns0:identificacao[1]/ns0:CPF[1]";
                            else if (xmlMainDoc.InnerXml.Contains("/ns0:guiaHonorarioIndividual[1]/ns0:contratadoExecutante[1]/ns0:identificacao[1]/ns0:CNPJ[1]"))
                                xPathAntigo = "/ns0:guiaHonorarioIndividual[1]/ns0:contratadoExecutante[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                            else if (xmlMainDoc.InnerXml.Contains("/ns0:guiaHonorarioIndividual[1]/ns0:contratadoExecutante[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]"))
                                xPathAntigo = "/ns0:guiaHonorarioIndividual[1]/ns0:contratadoExecutante[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";

                            switch (tipoCustomControlNovo)
                            {
                                case TipoCustomControlXmlMapping.CPF:
                                    xPathNovo = "/ns0:guiaHonorarioIndividual[1]/ns0:contratadoExecutante[1]/ns0:identificacao[1]/ns0:CPF[1]";
                                    break;
                                case TipoCustomControlXmlMapping.CNPJ:
                                    xPathNovo = "/ns0:guiaHonorarioIndividual[1]/ns0:contratadoExecutante[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                                    break;
                                case TipoCustomControlXmlMapping.CodigoPrestadorNaOperadora:
                                    xPathNovo = "/ns0:guiaHonorarioIndividual[1]/ns0:contratadoExecutante[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";
                                    break;
                            }
                            break;
                        default:
                            break;
                    }
                    break;
                case TipoGuia.Odontologia:
                    if (xmlMainDoc.InnerXml.Contains("/ns0:guiaOdontologia[1]/ns0:dadosContratadoExecutante[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:CPF[1]"))
                        xPathAntigo = "/ns0:guiaOdontologia[1]/ns0:dadosContratadoExecutante[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:CPF[1]";
                    else if (xmlMainDoc.InnerXml.Contains("/ns0:guiaOdontologia[1]/ns0:dadosContratadoExecutante[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:CNPJ[1]"))
                        xPathAntigo = "/ns0:guiaOdontologia[1]/ns0:dadosContratadoExecutante[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                    else if (xmlMainDoc.InnerXml.Contains("/ns0:guiaOdontologia[1]/ns0:dadosContratadoExecutante[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]"))
                        xPathAntigo = "/ns0:guiaOdontologia[1]/ns0:dadosContratadoExecutante[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";

                    switch (tipoCustomControlNovo)
                    {
                        case TipoCustomControlXmlMapping.CPF:
                            xPathNovo = "/ns0:guiaOdontologia[1]/ns0:dadosContratadoExecutante[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:CPF[1]";
                            break;
                        case TipoCustomControlXmlMapping.CNPJ:
                            xPathNovo = "/ns0:guiaOdontologia[1]/ns0:dadosContratadoExecutante[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                            break;
                        case TipoCustomControlXmlMapping.CodigoPrestadorNaOperadora:
                            xPathNovo = "/ns0:guiaOdontologia[1]/ns0:dadosContratadoExecutante[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";
                            break;
                    }
                    break;
                case TipoGuia.Solicitação_Internação:
                    break;
                case TipoGuia.Solicitação_Prorrogação:
                    break;
                case TipoGuia.Solicitação_SADT:
                    break;
                case TipoGuia.Solicitação_Odontologia:
                default:
                    break;
            }
            #endregion

            if ((!xPathAntigo.Equals("")) && (!xPathNovo.Equals("")))
            {
                xmlMainDoc.SelectSingleNode("//w:dataBinding[@w:xpath='" + xPathAntigo + "']",
                    nsManager).Attributes["w:xpath"].Value = xPathNovo;
            }

            return xmlMainDoc;
        }

        public static void SubstituiCustomXmlPart(string guiaPath, string xmlNewNode, XmlDocument xdocOriginal)
        {
            XmlDocument xdocReapresentacao = new XmlDocument();
            byte[] buffer = Encoding.GetEncoding("ISO-8859-1").GetBytes(xdocOriginal.InnerXml);
            try
            {
                using (WordprocessingDocument wdocReapresentacao = WordprocessingDocument.Open(guiaPath, true))
                {
                    foreach (CustomXmlPart cPartReapresentacao in wdocReapresentacao.MainDocumentPart.CustomXmlParts)
                    {
                        //Carrega a parte
                        xdocReapresentacao.Load(cPartReapresentacao.GetStream());
                        if (xdocReapresentacao.InnerXml.Contains(xmlNewNode))
                        {
                            cPartReapresentacao.GetStream().SetLength(buffer.Length);
                            cPartReapresentacao.GetStream().Write(buffer, 0, buffer.Length);
                            break;
                        }
                    }
                }
            }
            catch (Exception exx)
            { throw exx; }
        }

        /// <summary>
        /// Copia a guia Original para outro documento, troca o NodeElement pelo novo se Preciso
        /// </summary>
        /// <param name="xmlNodeOriginal">node Principal da guia Original</param>
        /// <param name="xmlNewNode">node Principal da nova guia de Reapresentação</param>
        /// <param name="newGuiaPath">caminho da nova guia de Reapresentação</param>
        /// <param name="guiaOriginalPath">caminho da guia Original a ser copiada</param>
        public static void SubstituiCustomXmlPartReapresentacao(string xmlNodeOriginal, string xmlNewNode, string newGuiaPath, string guiaOriginalPath, TipoGuia tipoGuia)
        {
            XmlDocument xdocOriginal = new XmlDocument();
            XmlDocument xdocReapresentacao = new XmlDocument();
            using (WordprocessingDocument wdocGuiaOriginal = WordprocessingDocument.Open(guiaOriginalPath, false))
            {
                foreach (CustomXmlPart cPartOriginal in wdocGuiaOriginal.MainDocumentPart.CustomXmlParts)
                {
                    //Carrega a parte
                    xdocOriginal.Load(cPartOriginal.GetStream());
                    //Encontrou?
                    if (xdocOriginal.InnerXml.Contains(xmlNodeOriginal))
                    {
                        XMLUtils.RenameElement(xdocOriginal.DocumentElement, xmlNewNode);
                        switch (tipoGuia)
                        {
                                //TODO:LoadXML caso não de certo
                            case TipoGuia.Consulta_Reapresentação:
                                xdocOriginal = XMLUtils.SubstituiCustomXmlPartConsulta(xdocOriginal);
                                break;
                            case TipoGuia.SP_SADT_Reapresentação:
                                xdocOriginal = XMLUtils.SubstituiCustomXmlPartSADT(xdocOriginal);
                                break;
                            case TipoGuia.Resumo_Internação_Reapresentação:
                                xdocOriginal = XMLUtils.SubstituiCustomXmlPartResumoInternacao(xdocOriginal);
                                break;
                            case TipoGuia.Honorário_Individual_Reapresentação:
                                xdocOriginal = XMLUtils.SubstituiCustomXmlPartHonorarioIndividual(xdocOriginal);
                                break;
                            case TipoGuia.Odontologia_Reapresentação:
                                xdocOriginal = XMLUtils.SubstituiCustomXmlPartOdonto(xdocOriginal);
                                break;
                        }

                        byte[] buffer = Encoding.GetEncoding("ISO-8859-1").GetBytes(xdocOriginal.InnerXml);
                        using (WordprocessingDocument wdocReapresentacao = WordprocessingDocument.Open(newGuiaPath, true))
                        {
                            foreach (CustomXmlPart cPartReapresentacao in wdocReapresentacao.MainDocumentPart.CustomXmlParts)
                            {
                                //Carrega a parte
                                xdocReapresentacao.Load(cPartReapresentacao.GetStream());
                                if (xdocReapresentacao.InnerXml.Contains(xmlNewNode))
                                {
                                    cPartReapresentacao.GetStream().SetLength(buffer.Length);
                                    cPartReapresentacao.GetStream().Write(buffer, 0, buffer.Length);
                                    break;
                                }
                            }
                        }
                        break;
                    }
                }
            }
        }

        /// <summary>
        /// Copia a guia Original para outro documento, troca o NodeElement pelo novo se Preciso
        /// </summary>
        /// <param name="xmlNodeOriginal">node Principal da guia Original</param>
        /// <param name="xmlNewNode">node Principal da nova guia de Reapresentação</param>
        /// <param name="newGuiaPath">caminho da nova guia de Reapresentação</param>
        /// <param name="guiaOriginalPath">caminho da guia Original a ser copiada</param>
        private static XmlDocument SubstituiCustomXmlPartConsulta(XmlDocument xDocOriginal)
        {
            XDocument xElementReapresentacao = XDocument.Parse(xDocOriginal.DocumentElement.OuterXml);

            IEnumerable<XElement> xOldElement = xElementReapresentacao.Descendants().Elements(XName.Get("dadosAtendimento", NamespaceANS));
            List<string> nodeValues = new List<string>();
            foreach (var item in xOldElement)
            {
                nodeValues.Add(item.Element(XName.Get("dataAtendimento", NamespaceANS)).Value);
                nodeValues.Add(item.Element(XName.Get("tipoConsulta", NamespaceANS)).Value);
                nodeValues.Add(item.Element(XName.Get("tipoSaida", NamespaceANS)).Value);
                nodeValues.Add(item.Element(XName.Get("procedimento", NamespaceANS)).Element(XName.Get("codigoTabela", NamespaceANS)).Value);
                nodeValues.Add(item.Element(XName.Get("procedimento", NamespaceANS)).Element(XName.Get("codigoProcedimento", NamespaceANS)).Value);
                item.ReplaceAll(GetXElement.ct_atendimentoConsultaReapr());
                item.Element(XName.Get("dataAtendimento", NamespaceANS)).Value = nodeValues[0];
                item.Element(XName.Get("tipoConsulta", NamespaceANS)).Value = nodeValues[1];
                item.Element(XName.Get("tipoSaida", NamespaceANS)).Value = nodeValues[2];
                item.Element(XName.Get("procedimento", NamespaceANS)).Element(XName.Get("codigoTabela", NamespaceANS)).Value = nodeValues[3];
                item.Element(XName.Get("procedimento", NamespaceANS)).Element(XName.Get("codigoProcedimento", NamespaceANS)).Value = nodeValues[4];
            }

            XmlDocument xDocReapresentacao = new XmlDocument();
            xDocReapresentacao.LoadXml(xElementReapresentacao.ToString());
            return xDocReapresentacao;
        }

        /// <summary>
        /// Copia a guia Original para outro documento, troca o NodeElement pelo novo se Preciso
        /// </summary>
        /// <param name="xmlNodeOriginal">node Principal da guia Original</param>
        /// <param name="xmlNewNode">node Principal da nova guia de Reapresentação</param>
        /// <param name="newGuiaPath">caminho da nova guia de Reapresentação</param>
        /// <param name="guiaOriginalPath">caminho da guia Original a ser copiada</param>
        private static XmlDocument SubstituiCustomXmlPartSADT(XmlDocument xDocOriginal)
        {
            XmlNamespaceManager nsManager = new XmlNamespaceManager(xDocOriginal.NameTable);
            nsManager.AddNamespace("ans", "http://www.ans.gov.br/padroes/tiss/schemas");
            nsManager.AddNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");

            XMLUtils.RenameNode(xDocOriginal.DocumentElement.SelectSingleNode(@"ans:diagnosticoAtendimento[1]", nsManager), "diagnosticoGuia");

            XDocument xDocReapresentacao = XDocument.Parse(xDocOriginal.DocumentElement.OuterXml);

            IEnumerable<XElement> xOldElementProcedimento = xDocReapresentacao.Descendants().Elements(XName.Get("procedimentosRealizados", NamespaceANS)).Elements(XName.Get("procedimentos", NamespaceANS));
            IEnumerable<XElement> xProcedimentosRealizados = xDocReapresentacao.Descendants().Elements(XName.Get("procedimentosRealizados", NamespaceANS));

            List<string> nodeProcedimentoValues = new List<string>();
            for (int i = xOldElementProcedimento.Count() - 1; i >= 0; i--)
			{
                XElement item = xOldElementProcedimento.ElementAt(i);
                nodeProcedimentoValues.Add(item.Element(XName.Get("data", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("horaInicio", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("horaFim", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("procedimento", NamespaceANS)).Element(XName.Get("codigo", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("procedimento", NamespaceANS)).Element(XName.Get("tipoTabela", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("procedimento", NamespaceANS)).Element(XName.Get("descricao", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("viaAcesso", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("tecnicaUtilizada", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("reducaoAcrescimo", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("valor", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("valorTotal", NamespaceANS)).Value);
                XElement newNode = XMLUtils.RenameElement(item, "procedimentosRevisao", NamespaceANS);
                newNode.RemoveAll();
                newNode.Add(GetXElement.ct_procedimentoRevisao().Elements());
                newNode.Add(new XAttribute(XNamespace.Xmlns + "ans", NamespaceANS));
                newNode.SetElementValue(XName.Get("data", NamespaceANS), nodeProcedimentoValues[0]);
                newNode.SetElementValue(XName.Get("horaInicio", NamespaceANS), nodeProcedimentoValues[1]);
                newNode.SetElementValue(XName.Get("horaFim", NamespaceANS), nodeProcedimentoValues[2]);
                newNode.Element(XName.Get("procedimento", NamespaceANS)).SetElementValue(XName.Get("codigo", NamespaceANS), nodeProcedimentoValues[3]);
                newNode.Element(XName.Get("procedimento", NamespaceANS)).SetElementValue(XName.Get("tipoTabela", NamespaceANS), nodeProcedimentoValues[4]);
                newNode.Element(XName.Get("procedimento", NamespaceANS)).SetElementValue(XName.Get("descricao", NamespaceANS), nodeProcedimentoValues[5]);
                newNode.SetElementValue(XName.Get("viaAcesso", NamespaceANS), nodeProcedimentoValues[6]);
                newNode.SetElementValue(XName.Get("tecnicaUtilizada", NamespaceANS), nodeProcedimentoValues[7]);
                newNode.SetElementValue(XName.Get("reducaoAcrescimo", NamespaceANS), nodeProcedimentoValues[8]);
                newNode.SetElementValue(XName.Get("valor", NamespaceANS), nodeProcedimentoValues[9]);
                newNode.SetElementValue(XName.Get("valorTotal", NamespaceANS), nodeProcedimentoValues[10]);
                item.Remove();
                xProcedimentosRealizados.First().AddFirst(newNode);
            }

            IEnumerable<XElement> xOldElementOPM = xDocReapresentacao.Descendants().Elements(XName.Get("OPMUtilizada", NamespaceANS)).Elements(XName.Get("OPM", NamespaceANS)).Elements(XName.Get("identificacaoOPM", NamespaceANS));
            IEnumerable<XElement> xOPMUtilizada = xDocReapresentacao.Descendants().Elements(XName.Get("OPMUtilizada", NamespaceANS)).Elements(XName.Get("OPM", NamespaceANS));
            List<string> nodeOPMValues = new List<string>();
            for (int i = xOldElementOPM.Count() - 1; i >= 0; i--)
			{
                XElement item = xOldElementOPM.ElementAt(i);
                nodeOPMValues.Add(item.Element(XName.Get("OPM", NamespaceANS)).Element(XName.Get("codigo", NamespaceANS)).Value);
                nodeOPMValues.Add(item.Element(XName.Get("OPM", NamespaceANS)).Element(XName.Get("tipoTabela", NamespaceANS)).Value);
                nodeOPMValues.Add(item.Element(XName.Get("OPM", NamespaceANS)).Element(XName.Get("descricao", NamespaceANS)).Value);
                nodeOPMValues.Add(item.Element(XName.Get("valorUnitario", NamespaceANS)).Value);
                nodeOPMValues.Add(item.Element(XName.Get("quantidade", NamespaceANS)).Value);
                nodeOPMValues.Add(item.Element(XName.Get("codigoBarra", NamespaceANS)).Value);
                nodeOPMValues.Add(item.Element(XName.Get("valorTotal", NamespaceANS)).Value);
                XElement newNode = XMLUtils.RenameElement(item, "OPM", NamespaceANS);
                newNode.RemoveAll();
                newNode.Add(GetXElement.ct_OPMUtilizadaRevisao().Elements());
                newNode.Add(new XAttribute(XNamespace.Xmlns + "ans", NamespaceANS));
                newNode.Element(XName.Get("OPM", NamespaceANS)).SetElementValue(XName.Get("codigo", NamespaceANS), nodeOPMValues[0]);
                newNode.Element(XName.Get("OPM", NamespaceANS)).SetElementValue(XName.Get("tipoTabela", NamespaceANS), nodeOPMValues[1]);
                newNode.Element(XName.Get("OPM", NamespaceANS)).SetElementValue(XName.Get("descricao", NamespaceANS), nodeOPMValues[2]);
                newNode.SetElementValue(XName.Get("valorUnitario", NamespaceANS), nodeOPMValues[3]);
                newNode.SetElementValue(XName.Get("quantidade", NamespaceANS), nodeOPMValues[4]);
                newNode.SetElementValue(XName.Get("codigoBarra", NamespaceANS), nodeOPMValues[5]);
                newNode.SetElementValue(XName.Get("valorTotal", NamespaceANS), nodeOPMValues[6]);
                item.Remove();
                xOPMUtilizada.First().AddFirst(newNode);
            }

            IEnumerable<XElement> xOldElementOD = xDocReapresentacao.Descendants().Elements(XName.Get("outrasDespesas", NamespaceANS)).Elements(XName.Get("despesa", NamespaceANS));
            IEnumerable<XElement> xOutrasDespesas = xDocReapresentacao.Descendants().Elements(XName.Get("outrasDespesas", NamespaceANS));
            List<string> nodeODValues = new List<string>();
            for (int i = xOldElementOD.Count() - 1; i >= 0; i--)
            {
                XElement item = xOldElementOD.ElementAt(i);
                nodeODValues.Add(item.Element(XName.Get("tipoDespesa", NamespaceANS)).Value);
                nodeODValues.Add(item.Element(XName.Get("dataRealizacao", NamespaceANS)).Value);
                nodeODValues.Add(item.Element(XName.Get("identificadorDespesa", NamespaceANS)).Element(XName.Get("codigo", NamespaceANS)).Value);
                nodeODValues.Add(item.Element(XName.Get("identificadorDespesa", NamespaceANS)).Element(XName.Get("tipoTabela", NamespaceANS)).Value);
                nodeODValues.Add(item.Element(XName.Get("identificadorDespesa", NamespaceANS)).Element(XName.Get("descricao", NamespaceANS)).Value);
                nodeODValues.Add(item.Element(XName.Get("reducaoAcrescimo", NamespaceANS)).Value);
                nodeODValues.Add(item.Element(XName.Get("quantidade", NamespaceANS)).Value);
                nodeODValues.Add(item.Element(XName.Get("valorUnitario", NamespaceANS)).Value);
                nodeODValues.Add(item.Element(XName.Get("valorTotal", NamespaceANS)).Value);
                XElement newNode = XMLUtils.RenameElement(item, "itensDespesas", NamespaceANS);
                newNode.RemoveAll();
                newNode.Add(GetXElement.ct_outrasDespesasRevisao().Elements());
                newNode.Add(new XAttribute(XNamespace.Xmlns + "ans", NamespaceANS));
                newNode.SetElementValue(XName.Get("tipoDespesa", NamespaceANS), nodeODValues[0]);
                newNode.SetElementValue(XName.Get("dataRealizacao", NamespaceANS), nodeODValues[1]);
                newNode.Element(XName.Get("despesa", NamespaceANS)).SetElementValue(XName.Get("codigo", NamespaceANS), nodeODValues[2]);
                newNode.Element(XName.Get("despesa", NamespaceANS)).SetElementValue(XName.Get("tipoTabela", NamespaceANS), nodeODValues[3]);
                newNode.Element(XName.Get("despesa", NamespaceANS)).SetElementValue(XName.Get("descricao", NamespaceANS), nodeODValues[4]);
                newNode.SetElementValue(XName.Get("reducaoAcrescimo", NamespaceANS), nodeODValues[5]);
                newNode.SetElementValue(XName.Get("quantidade", NamespaceANS), nodeODValues[6]);
                newNode.SetElementValue(XName.Get("valorUnitario", NamespaceANS), nodeODValues[7]);
                newNode.SetElementValue(XName.Get("valorTotal", NamespaceANS), nodeODValues[8]);
                item.Remove();
                xOutrasDespesas.First().AddFirst(newNode);
            }

            XmlDocument xmlDocReapresentacao = new XmlDocument();
            xmlDocReapresentacao.LoadXml(xDocReapresentacao.ToString());
            return xmlDocReapresentacao;
        }

        /// <summary>
        /// Copia a guia Original para outro documento, troca o NodeElement pelo novo se Preciso
        /// </summary>
        /// <param name="xmlNodeOriginal">node Principal da guia Original</param>
        /// <param name="xmlNewNode">node Principal da nova guia de Reapresentação</param>
        /// <param name="newGuiaPath">caminho da nova guia de Reapresentação</param>
        /// <param name="guiaOriginalPath">caminho da guia Original a ser copiada</param>
        private static XmlDocument SubstituiCustomXmlPartResumoInternacao(XmlDocument xDocOriginal)
        {
            XDocument xDocReapresentacao = XDocument.Parse(xDocOriginal.DocumentElement.OuterXml);

            IEnumerable<XElement> xOldElementProcedimento = xDocReapresentacao.Descendants().Elements(XName.Get("procedimentosRealizados", NamespaceANS)).Elements(XName.Get("procedimentos", NamespaceANS));
            IEnumerable<XElement> xProcedimentosRealizados = xDocReapresentacao.Descendants().Elements(XName.Get("procedimentosRealizados", NamespaceANS));

            List<string> nodeProcedimentoValues = new List<string>();
            for (int i = xOldElementProcedimento.Count() - 1; i >= 0; i--)
            {
                XElement item = xOldElementProcedimento.ElementAt(i);
                nodeProcedimentoValues.Add(item.Element(XName.Get("data", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("horaInicio", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("horaFim", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("procedimento", NamespaceANS)).Element(XName.Get("codigo", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("procedimento", NamespaceANS)).Element(XName.Get("tipoTabela", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("procedimento", NamespaceANS)).Element(XName.Get("descricao", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("viaAcesso", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("tecnicaUtilizada", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("reducaoAcrescimo", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("valor", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("valorTotal", NamespaceANS)).Value);
                XElement newNode = XMLUtils.RenameElement(item, "procedimentosRevisao", NamespaceANS);
                newNode.RemoveAll();
                newNode.Add(GetXElement.ct_procedimentoRevisao().Elements());
                newNode.Add(new XAttribute(XNamespace.Xmlns + "ans", NamespaceANS));
                newNode.SetElementValue(XName.Get("data", NamespaceANS), nodeProcedimentoValues[0]);
                newNode.SetElementValue(XName.Get("horaInicio", NamespaceANS), nodeProcedimentoValues[1]);
                newNode.SetElementValue(XName.Get("horaFim", NamespaceANS), nodeProcedimentoValues[2]);
                newNode.Element(XName.Get("procedimento", NamespaceANS)).SetElementValue(XName.Get("codigo", NamespaceANS), nodeProcedimentoValues[3]);
                newNode.Element(XName.Get("procedimento", NamespaceANS)).SetElementValue(XName.Get("tipoTabela", NamespaceANS), nodeProcedimentoValues[4]);
                newNode.Element(XName.Get("procedimento", NamespaceANS)).SetElementValue(XName.Get("descricao", NamespaceANS), nodeProcedimentoValues[5]);
                newNode.SetElementValue(XName.Get("viaAcesso", NamespaceANS), nodeProcedimentoValues[6]);
                newNode.SetElementValue(XName.Get("tecnicaUtilizada", NamespaceANS), nodeProcedimentoValues[7]);
                newNode.SetElementValue(XName.Get("reducaoAcrescimo", NamespaceANS), nodeProcedimentoValues[8]);
                newNode.SetElementValue(XName.Get("valor", NamespaceANS), nodeProcedimentoValues[9]);
                newNode.SetElementValue(XName.Get("valorTotal", NamespaceANS), nodeProcedimentoValues[10]);
                item.Remove();
                xProcedimentosRealizados.First().AddFirst(newNode);
            }

            IEnumerable<XElement> xOldElementOPM = xDocReapresentacao.Descendants().Elements(XName.Get("OPMUtilizada", NamespaceANS)).Elements(XName.Get("OPM", NamespaceANS)).Elements(XName.Get("identificacaoOPM", NamespaceANS));
            IEnumerable<XElement> xOPMUtilizada = xDocReapresentacao.Descendants().Elements(XName.Get("OPMUtilizada", NamespaceANS)).Elements(XName.Get("OPM", NamespaceANS));
            List<string> nodeOPMValues = new List<string>();
            for (int i = xOldElementOPM.Count() - 1; i >= 0; i--)
            {
                XElement item = xOldElementOPM.ElementAt(i);
                nodeOPMValues.Add(item.Element(XName.Get("OPM", NamespaceANS)).Element(XName.Get("codigo", NamespaceANS)).Value);
                nodeOPMValues.Add(item.Element(XName.Get("OPM", NamespaceANS)).Element(XName.Get("tipoTabela", NamespaceANS)).Value);
                nodeOPMValues.Add(item.Element(XName.Get("OPM", NamespaceANS)).Element(XName.Get("descricao", NamespaceANS)).Value);
                nodeOPMValues.Add(item.Element(XName.Get("valorUnitario", NamespaceANS)).Value);
                nodeOPMValues.Add(item.Element(XName.Get("quantidade", NamespaceANS)).Value);
                nodeOPMValues.Add(item.Element(XName.Get("codigoBarra", NamespaceANS)).Value);
                nodeOPMValues.Add(item.Element(XName.Get("valorTotal", NamespaceANS)).Value);
                XElement newNode = XMLUtils.RenameElement(item, "OPM", NamespaceANS);
                newNode.RemoveAll();
                newNode.Add(GetXElement.ct_OPMUtilizadaRevisao().Elements());
                newNode.Add(new XAttribute(XNamespace.Xmlns + "ans", NamespaceANS));
                newNode.Element(XName.Get("OPM", NamespaceANS)).SetElementValue(XName.Get("codigo", NamespaceANS), nodeOPMValues[0]);
                newNode.Element(XName.Get("OPM", NamespaceANS)).SetElementValue(XName.Get("tipoTabela", NamespaceANS), nodeOPMValues[1]);
                newNode.Element(XName.Get("OPM", NamespaceANS)).SetElementValue(XName.Get("descricao", NamespaceANS), nodeOPMValues[2]);
                newNode.SetElementValue(XName.Get("valorUnitario", NamespaceANS), nodeOPMValues[3]);
                newNode.SetElementValue(XName.Get("quantidade", NamespaceANS), nodeOPMValues[4]);
                newNode.SetElementValue(XName.Get("codigoBarra", NamespaceANS), nodeOPMValues[5]);
                newNode.SetElementValue(XName.Get("valorTotal", NamespaceANS), nodeOPMValues[6]);
                item.Remove();
                xOPMUtilizada.First().AddFirst(newNode);
            }

            IEnumerable<XElement> xOldElementOD = xDocReapresentacao.Descendants().Elements(XName.Get("outrasDespesas", NamespaceANS)).Elements(XName.Get("despesa", NamespaceANS));
            IEnumerable<XElement> xOutrasDespesas = xDocReapresentacao.Descendants().Elements(XName.Get("outrasDespesas", NamespaceANS));
            List<string> nodeODValues = new List<string>();
            for (int i = xOldElementOD.Count() - 1; i >= 0; i--)
            {
                XElement item = xOldElementOD.ElementAt(i);
                nodeODValues.Add(item.Element(XName.Get("tipoDespesa", NamespaceANS)).Value);
                nodeODValues.Add(item.Element(XName.Get("dataRealizacao", NamespaceANS)).Value);
                nodeODValues.Add(item.Element(XName.Get("identificadorDespesa", NamespaceANS)).Element(XName.Get("codigo", NamespaceANS)).Value);
                nodeODValues.Add(item.Element(XName.Get("identificadorDespesa", NamespaceANS)).Element(XName.Get("tipoTabela", NamespaceANS)).Value);
                nodeODValues.Add(item.Element(XName.Get("identificadorDespesa", NamespaceANS)).Element(XName.Get("descricao", NamespaceANS)).Value);
                nodeODValues.Add(item.Element(XName.Get("reducaoAcrescimo", NamespaceANS)).Value);
                nodeODValues.Add(item.Element(XName.Get("quantidade", NamespaceANS)).Value);
                nodeODValues.Add(item.Element(XName.Get("valorUnitario", NamespaceANS)).Value);
                nodeODValues.Add(item.Element(XName.Get("valorTotal", NamespaceANS)).Value);
                XElement newNode = XMLUtils.RenameElement(item, "itensDespesas", NamespaceANS);
                newNode.RemoveAll();
                newNode.Add(GetXElement.ct_outrasDespesasRevisao().Elements());
                newNode.Add(new XAttribute(XNamespace.Xmlns + "ans", NamespaceANS));
                newNode.SetElementValue(XName.Get("tipoDespesa", NamespaceANS), nodeODValues[0]);
                newNode.SetElementValue(XName.Get("dataRealizacao", NamespaceANS), nodeODValues[1]);
                newNode.Element(XName.Get("despesa", NamespaceANS)).SetElementValue(XName.Get("codigo", NamespaceANS), nodeODValues[2]);
                newNode.Element(XName.Get("despesa", NamespaceANS)).SetElementValue(XName.Get("tipoTabela", NamespaceANS), nodeODValues[3]);
                newNode.Element(XName.Get("despesa", NamespaceANS)).SetElementValue(XName.Get("descricao", NamespaceANS), nodeODValues[4]);
                newNode.SetElementValue(XName.Get("reducaoAcrescimo", NamespaceANS), nodeODValues[5]);
                newNode.SetElementValue(XName.Get("quantidade", NamespaceANS), nodeODValues[6]);
                newNode.SetElementValue(XName.Get("valorUnitario", NamespaceANS), nodeODValues[7]);
                newNode.SetElementValue(XName.Get("valorTotal", NamespaceANS), nodeODValues[8]);
                item.Remove();
                xOutrasDespesas.First().AddFirst(newNode);
            }

            XmlDocument xmlDocReapresentacao = new XmlDocument();
            xmlDocReapresentacao.LoadXml(xDocReapresentacao.ToString());
            return xmlDocReapresentacao;
        }
        
        /// <summary>
        /// Copia a guia Original para outro documento, troca o NodeElement pelo novo se Preciso
        /// </summary>
        /// <param name="xmlNodeOriginal">node Principal da guia Original</param>
        /// <param name="xmlNewNode">node Principal da nova guia de Reapresentação</param>
        /// <param name="newGuiaPath">caminho da nova guia de Reapresentação</param>
        /// <param name="guiaOriginalPath">caminho da guia Original a ser copiada</param>
        private static XmlDocument SubstituiCustomXmlPartHonorarioIndividual(XmlDocument xDocOriginal)
        {
            XDocument xDocReapresentacao = XDocument.Parse(xDocOriginal.DocumentElement.OuterXml);

            IEnumerable<XElement> xOldElementProcedimento = xDocReapresentacao.Descendants().Elements(XName.Get("procedimentosExamesRealizados", NamespaceANS)).Elements(XName.Get("procedimentos", NamespaceANS));
            IEnumerable<XElement> xProcedimentosRealizados = xDocReapresentacao.Descendants().Elements(XName.Get("procedimentosExamesRealizados", NamespaceANS));

            List<string> nodeProcedimentoValues = new List<string>();
            for (int i = xOldElementProcedimento.Count() - 1; i >= 0; i--)
            {
                XElement item = xOldElementProcedimento.ElementAt(i);
                nodeProcedimentoValues.Add(item.Element(XName.Get("data", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("horaInicio", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("horaFim", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("procedimento", NamespaceANS)).Element(XName.Get("codigo", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("procedimento", NamespaceANS)).Element(XName.Get("tipoTabela", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("procedimento", NamespaceANS)).Element(XName.Get("descricao", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("viaAcesso", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("tecnicaUtilizada", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("reducaoAcrescimo", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("valor", NamespaceANS)).Value);
                nodeProcedimentoValues.Add(item.Element(XName.Get("valorTotal", NamespaceANS)).Value);
                XElement newNode = XMLUtils.RenameElement(item, "procedimentosRevisao", NamespaceANS);
                newNode.RemoveAll();
                newNode.Add(GetXElement.ct_procedimentoRevisao().Elements());
                newNode.Add(new XAttribute(XNamespace.Xmlns + "ans", NamespaceANS));
                newNode.SetElementValue(XName.Get("data", NamespaceANS), nodeProcedimentoValues[0]);
                newNode.SetElementValue(XName.Get("horaInicio", NamespaceANS), nodeProcedimentoValues[1]);
                newNode.SetElementValue(XName.Get("horaFim", NamespaceANS), nodeProcedimentoValues[2]);
                newNode.Element(XName.Get("procedimento", NamespaceANS)).SetElementValue(XName.Get("codigo", NamespaceANS), nodeProcedimentoValues[3]);
                newNode.Element(XName.Get("procedimento", NamespaceANS)).SetElementValue(XName.Get("tipoTabela", NamespaceANS), nodeProcedimentoValues[4]);
                newNode.Element(XName.Get("procedimento", NamespaceANS)).SetElementValue(XName.Get("descricao", NamespaceANS), nodeProcedimentoValues[5]);
                newNode.SetElementValue(XName.Get("viaAcesso", NamespaceANS), nodeProcedimentoValues[6]);
                newNode.SetElementValue(XName.Get("tecnicaUtilizada", NamespaceANS), nodeProcedimentoValues[7]);
                newNode.SetElementValue(XName.Get("reducaoAcrescimo", NamespaceANS), nodeProcedimentoValues[8]);
                newNode.SetElementValue(XName.Get("valor", NamespaceANS), nodeProcedimentoValues[9]);
                newNode.SetElementValue(XName.Get("valorTotal", NamespaceANS), nodeProcedimentoValues[10]);
                item.Remove();
                xProcedimentosRealizados.First().AddFirst(newNode);
            }

            XmlDocument xmlDocReapresentacao = new XmlDocument();
            xmlDocReapresentacao.LoadXml(xDocReapresentacao.ToString());
            return xmlDocReapresentacao;
        }

        /// <summary>
        /// Copia a guia Original para outro documento, troca o NodeElement pelo novo se Preciso
        /// </summary>
        /// <param name="xmlNodeOriginal">node Principal da guia Original</param>
        /// <param name="xmlNewNode">node Principal da nova guia de Reapresentação</param>
        /// <param name="newGuiaPath">caminho da nova guia de Reapresentação</param>
        /// <param name="guiaOriginalPath">caminho da guia Original a ser copiada</param>
        private static XmlDocument SubstituiCustomXmlPartOdonto(XmlDocument xDocOriginal)
        {
            XDocument xElementReapresentacao = XDocument.Parse(xDocOriginal.DocumentElement.OuterXml);

            /*IEnumerable<XElement> xOldElement = xElementReapresentacao.Descendants().Elements(XName.Get("dadosAtendimento", NamespaceANS));
            foreach (var item in xOldElement)
            {
                string dataAtendimento = item.Element(XName.Get("dataAtendimento", NamespaceANS)).Value;
                string tipoConsulta = item.Element(XName.Get("tipoConsulta", NamespaceANS)).Value;
                string tipoSaida = item.Element(XName.Get("tipoSaida", NamespaceANS)).Value;
                string codigoTabela = item.Element(XName.Get("procedimento", NamespaceANS)).Element(XName.Get("codigoTabela", NamespaceANS)).Value;
                string codigoProcedimento = item.Element(XName.Get("procedimento", NamespaceANS)).Element(XName.Get("codigoProcedimento", NamespaceANS)).Value;
                item.ReplaceWith(GetXElement.ct_atendimentoConsultaReapr());
                item.Element(XName.Get("dataAtendimento", NamespaceANS)).Value = dataAtendimento;
                item.Element(XName.Get("tipoConsulta", NamespaceANS)).Value = tipoConsulta;
                item.Element(XName.Get("tipoSaida", NamespaceANS)).Value = tipoSaida;
                item.Element(XName.Get("procedimento", NamespaceANS)).Element(XName.Get("codigoTabela", NamespaceANS)).Value = codigoTabela;
                item.Element(XName.Get("procedimento", NamespaceANS)).Element(XName.Get("codigoProcedimento", NamespaceANS)).Value = codigoProcedimento;
            }*/

            XmlDocument xDocReapresentacao = new XmlDocument();
            xDocReapresentacao.LoadXml(xElementReapresentacao.ToString());
            return xDocReapresentacao;
        }

        /// <summary>
        /// Substitui MainDocumentPart da guia pelo XmlDocument passados como parâmetro
        /// </summary>
        /// <param name="guiaPath">Path da guia a ser manipulada</param>
        /// <param name="xmlMainDoc">XML da nova MainDocumentPart</param>
        public static void SubstituiMainDocumentPart(string guiaPath, XmlDocument xmlMainDoc)
        {
            // O Encode do MainDocumentPart é UTF-8 (Word), diferente da mensagem TISS (ISO-8859-1)
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(xmlMainDoc.InnerXml);
            try
            {
                using (WordprocessingDocument wdoc = WordprocessingDocument.Open(guiaPath, true))
                {
                    wdoc.MainDocumentPart.GetStream().SetLength(buffer.Length);
                    wdoc.MainDocumentPart.GetStream().Write(buffer, 0, buffer.Length);
                }
            }
            catch (Exception exx)
            { throw exx; }
        }

        public static string BuscaXPathCodigoPrestadorExistente(XPathCustomXml xPathGuia, XmlDocument xDoc, XmlNamespaceManager nsManager)
        {
            if (xDoc.SelectSingleNode(xPathGuia.CPF, nsManager) != null)
                return xPathGuia.CPF;
            else if (xDoc.SelectSingleNode(xPathGuia.CNPJ, nsManager) != null)
                return xPathGuia.CNPJ;
            else if (xDoc.SelectSingleNode(xPathGuia.CodigoPrestadorNaOperadora, nsManager) != null)
                return xPathGuia.CodigoPrestadorNaOperadora;

            return null;
        }

        public static Stream GetCustomXmlPart(string filePath, string NodeRoot)
        {
            using (WordprocessingDocument wdoc = WordprocessingDocument.Open(filePath, false))
            {

                //Buscando o CustomXML referente a Guia
                foreach (CustomXmlPart cPart in wdoc.MainDocumentPart.CustomXmlParts)
                {
                    //Carrega a parte
                    XmlDocument xdoc = new XmlDocument();
                    xdoc.Load(cPart.GetStream());

                    //Encontrou?

                    if (xdoc.InnerXml.Contains(NodeRoot))
                    {
                        byte[] buffer = System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(xdoc.InnerXml);
                        Stream str = new MemoryStream(buffer);

                        return str;
                    }
                }
            }
            return null;
        }

        public static XmlSerializerNamespaces ANSnamespace()
        {
            XmlSerializerNamespaces nspc = new XmlSerializerNamespaces();
            nspc.Add("ans", NamespaceANS);
            return nspc;
        }

        public static XmlRootAttribute ElementRootWithANSnamespace(string elementName)
        {
            XmlRootAttribute xRoot = new XmlRootAttribute();
            xRoot.ElementName = elementName;
            xRoot.Namespace = "http://www.ans.gov.br/padroes/tiss/schemas";
            xRoot.IsNullable = true;
            return xRoot;
        }

        public static int GetNumberOfProcedimentosFromCustomXML(Microsoft.Office.Core.CustomXMLPart cPart, TipoGuia tipoGuia)
        { 
            NameTable nt = new NameTable();
            XmlDocument partXML = new XmlDocument(nt);

            XmlNamespaceManager nsManager = new XmlNamespaceManager(nt);
            nsManager.AddNamespace("ans", "http://www.ans.gov.br/padroes/tiss/schemas");

            partXML.LoadXml(cPart.XML);

            //Localizando todos Procedimentos
            XmlNodeList procedimentosList = null;
            switch (tipoGuia)
            {
                case TipoGuia.SP_SADT:
                case TipoGuia.Resumo_Internação:
                    procedimentosList = partXML.SelectNodes("//ans:procedimentos", nsManager);
                    break;
                case TipoGuia.Honorário_Individual:
                    procedimentosList = partXML.SelectNodes("//ans:procedimentoRealizado", nsManager);
                    break;
                case TipoGuia.Odontologia:
                case TipoGuia.Odontologia_Reapresentação:
                    procedimentosList = partXML.SelectNodes("//ans:procedimentoExecutado", nsManager);
                    break;
                case TipoGuia.SP_SADT_Reapresentação:
                case TipoGuia.Resumo_Internação_Reapresentação:
                case TipoGuia.Honorário_Individual_Reapresentação:
                    procedimentosList = partXML.SelectNodes("//ans:procedimentosRevisao", nsManager);    
                    break;
                case TipoGuia.Solicitação_Internação:
                case TipoGuia.Solicitação_Prorrogação:
                case TipoGuia.Solicitação_SADT:
                case TipoGuia.Solicitação_Odontologia:
                    procedimentosList = partXML.SelectNodes("//ans:procedimentoSolicitado", nsManager);    
                    break;
            }
            return procedimentosList.Count;
        }

        public static int GetNumberOfOPMSFromCustomXML(Microsoft.Office.Core.CustomXMLPart cPart, TipoGuia tipoGuia)
        {
            NameTable nt = new NameTable();
            XmlDocument partXML = new XmlDocument(nt);

            XmlNamespaceManager nsManager = new XmlNamespaceManager(nt);
            nsManager.AddNamespace("ans", "http://www.ans.gov.br/padroes/tiss/schemas");

            partXML.LoadXml(cPart.XML);

            //Localizando todos Procedimentos
            XmlNodeList OPMsList = null;
            switch (tipoGuia)
            {
                case TipoGuia.SP_SADT:
                case TipoGuia.Resumo_Internação:
                    OPMsList = partXML.SelectNodes("//ans:identificacaoOPM", nsManager);    
                    break;
                case TipoGuia.SP_SADT_Reapresentação:
                case TipoGuia.Resumo_Internação_Reapresentação:
                    OPMsList = partXML.SelectNodes("//ans:OPM", nsManager);
                    break;
                case TipoGuia.Solicitação_Internação:
                case TipoGuia.Solicitação_Prorrogação:
                case TipoGuia.Solicitação_SADT:
                    OPMsList = partXML.SelectNodes("//ans:OPMSolicitada", nsManager);
                    break;
            }
            return OPMsList.Count;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="objetoTiss">Objeto que deve ser serializado para o Stream de retorno.</param>
        /// <param name="rootObjeto">Raiz do XML (ex. XMLUtils.ElementRootWithANSnamespace("guiaConsulta")). Pode ser nulo.</param>
        /// <returns></returns>
        public static Stream Serializa(object objetoTiss, XmlRootAttribute rootObjeto)
        {
            // Namespace
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add("ans", "http://www.ans.gov.br/padroes/tiss/schemas");
            ns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
            ns.Add("xsd", "http://www.w3.org/2001/XMLSchema");

            XmlSerializer serializer;
            if (rootObjeto != null)
                serializer = new XmlSerializer(objetoTiss.GetType(), rootObjeto);
            else
                serializer = new XmlSerializer(objetoTiss.GetType());

            Stream serializaStream = new MemoryStream();

            try
            {
                // Serializa o objeto
                XmlTextWriter writer = new XmlTextWriter(serializaStream, Encoding.GetEncoding("ISO-8859-1"));
                serializer.Serialize(writer, objetoTiss, ns);
                serializaStream.Position = 0;

                return serializaStream;
            }
            catch { return null; }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="objetoTiss">Objeto a ser deserializado.</param>
        /// <param name="tipoObjeto">Tipo do objeto a ser deserializado.</param>
        /// <param name="rootObjeto">Raiz do XML (ex. XMLUtils.ElementRootWithANSnamespace("guiaConsulta")). Pode ser nulo.</param>
        /// <returns></returns>
        public static object Deserializa(Stream objetoTiss, Type tipoObjeto, XmlRootAttribute rootObjeto)
        {
            objetoTiss.Position = 0;
            object retorno = null;

            XmlSerializer serializer;
            if (rootObjeto != null)
                serializer = new XmlSerializer(tipoObjeto, rootObjeto);
            else
                serializer = new XmlSerializer(tipoObjeto);

            try
            {
                // Deserializa o objeto
                retorno = serializer.Deserialize(objetoTiss);
                return retorno;
            }
            catch(Exception ex) {
                string asd = ex.Message;
                return null; }
        }
    }

    public class XPathCustomXml
    {
        #region Properties

        private string registroANS = "";
        public string RegistroANS
        {
            get { return registroANS; }
            set { registroANS = value; }
        }
        private string nomeContratado = "";
        public string NomeContratado
        {
            get { return nomeContratado; }
            set { nomeContratado = value; }
        }
        private string tipoLogradouro = "";
        public string TipoLogradouro
        {
            get { return tipoLogradouro; }
            set { tipoLogradouro = value; }
        }
        private string logradouro = "";
        public string Logradouro
        {
            get { return logradouro; }
            set { logradouro = value; }
        }
        private string numero = "";
        public string Numero
        {
            get { return numero; }
            set { numero = value; }
        }
        private string complemento = "";
        public string Complemento
        {
            get { return complemento; }
            set { complemento = value; }
        }
        private string codigoIBGEMunicipio = "";
        public string CodigoIBGEMunicipio
        {
            get { return codigoIBGEMunicipio; }
            set { codigoIBGEMunicipio = value; }
        }
        private string municipio = "";
        public string Municipio
        {
            get { return municipio; }
            set { municipio = value; }
        }
        private string codigoUF = "";
        public string CodigoUF
        {
            get { return codigoUF; }
            set { codigoUF = value; }
        }
        private string cep = "";
        public string Cep
        {
            get { return cep; }
            set { cep = value; }
        }
        private string codigoPrestadorNaOperadora = "";
        public string CodigoPrestadorNaOperadora
        {
            get { return codigoPrestadorNaOperadora; }
            set { codigoPrestadorNaOperadora = value; }
        }
        private string cpf = "";
        public string CPF
        {
            get { return cpf; }
            set { cpf = value; }
        }
        private string cnpj = "";
        public string CNPJ
        {
            get { return cnpj; }
            set { cnpj = value; }
        }
        private string nomeProfissional = "";
        public string NomeProfissional
        {
            get { return nomeProfissional; }
            set { nomeProfissional = value; }
        }
        private string siglaConselho = "";
        public string SiglaConselho
        {
            get { return siglaConselho; }
            set { siglaConselho = value; }
        }
        private string numeroConselho = "";
        public string NumeroConselho
        {
            get { return numeroConselho; }
            set { numeroConselho = value; }
        }
        private string ufConselho = "";
        public string UFConselho
        {
            get { return ufConselho; }
            set { ufConselho = value; }
        }
        private string cnes = "";
        public string CNES
        {
            get { return cnes; }
            set { cnes = value; }
        }
        private string cbos = "";
        public string CBOS
        {
            get { return cbos; }
            set { cbos = value; }
        }

        #endregion
        /// <summary>
        /// Mapeia os endereços (xPath) do customXML de acordo com o tipo da guia e o tipo do profissional
        /// </summary>
        /// <param name="tipoGuia"></param>
        /// <param name="tipoProfissional">Profissional Solicitante OU Executante</param>
        public XPathCustomXml(TipoGuia tipoGuia, TipoProfissional tipoProfissional)
        {
            if (tipoProfissional != TipoProfissional.ProfissionalSolicitanteExecutante)
            {
                string xPathGuia = "";
                string conselhoProfissional = "";
                switch (tipoGuia)
                {
                    case TipoGuia.Consulta:
                    case TipoGuia.Consulta_Reapresentação:
                        xPathGuia = "//ans:dadosContratado";
                        if (tipoProfissional == TipoProfissional.ProfissionalExecutante)
                        {
                            NomeProfissional = "//ans:profissionalExecutante/ans:nomeProfissional";
                            conselhoProfissional = "//ans:profissionalExecutante/ans:conselhoProfissional";
                            cbos = "//ans:profissionalExecutante/ans:cbos";
                        }
                        break;
                    case TipoGuia.Resumo_Internação:
                    case TipoGuia.Resumo_Internação_Reapresentação:
                        xPathGuia = "//ans:identificacaoExecutante";
                        break;
                    case TipoGuia.Honorário_Individual:
                    case TipoGuia.Honorário_Individual_Reapresentação:
                        switch (tipoProfissional)
                        {
                            case TipoProfissional.ProfissionalSolicitante:
                                xPathGuia = "//ans:contratado";
                                break;
                            case TipoProfissional.ProfissionalExecutante:
                                xPathGuia = "//ans:contratadoExecutante";

                                NomeProfissional = "//ans:identificacaoProfissional/ans:nomeExecutante";
                                conselhoProfissional = "//ans:identificacaoProfissional/ans:conselhoProfissional";
                                cbos = "//ans:identificacaoProfissional/ans:codigoCBOS";
                                break;
                            default:
                                break;
                        }
                        break;
                    case TipoGuia.SP_SADT:
                    case TipoGuia.SP_SADT_Reapresentação:
                        switch (tipoProfissional)
                        {
                            case TipoProfissional.ProfissionalSolicitante:
                                xPathGuia = "//ans:dadosSolicitante/ans:contratado";

                                NomeProfissional = "//ans:profissional/ans:nomeProfissional";
                                conselhoProfissional = "//ans:profissional/ans:conselhoProfissional";
                                cbos = "//ans:profissional/ans:cbos";
                                break;
                            case TipoProfissional.ProfissionalExecutante:
                                xPathGuia = "//ans:prestadorExecutante";

                                NomeProfissional = "//ans:profissionalExecutanteCompl/ans:nomeExecutante";
                                conselhoProfissional = "//ans:profissionalExecutanteCompl/ans:conselhoProfissional";
                                cbos = "//ans:profissionalExecutanteCompl/ans:codigoCBOS";
                                break;
                            default:
                                break;
                        }
                        break;
                    case TipoGuia.Odontologia:
                    case TipoGuia.Odontologia_Reapresentação:
                        xPathGuia = "//ans:dadosContratadoExecutante/ans:dadosContratado";
                        if (tipoProfissional == TipoProfissional.ProfissionalExecutante)
                        {
                            NomeProfissional = "//ans:dadosContratadoExecutante/ans:dadosExecutante/ans:nomeExecutante";
                            conselhoProfissional = "//ans:dadosContratadoExecutante/ans:dadosExecutante/ans:conselhoProfissional";
                            cbos = "//ans:dadosContratadoExecutante/ans:dadosExecutante/ans:codigoCBOS";
                        }
                        break;
                    //case TipoGuia.Solicitação_Internação:
                    //case TipoGuia.Solicitação_Prorrogação:
                    //case TipoGuia.Solicitação_SADT:
                    //case TipoGuia.Solicitação_Odontologia:
                    default:
                        break;
                }

                if (!xPathGuia.Equals(""))
                {
                    RegistroANS = "//ans:registroANS";
                    NomeContratado = xPathGuia + "/ans:nomeContratado";

                    string xPathEnderecoContratado = xPathGuia + "/ans:enderecoContratado";
                    TipoLogradouro = xPathEnderecoContratado + "/ans:tipoLogradouro";
                    Logradouro = xPathEnderecoContratado + "/ans:logradouro";
                    Numero = xPathEnderecoContratado + "/ans:numero";
                    Complemento = xPathEnderecoContratado + "/ans:complemento";
                    CodigoIBGEMunicipio = xPathEnderecoContratado + "/ans:codigoIBGEMunicipio";
                    Municipio = xPathEnderecoContratado + "/ans:municipio";
                    CodigoUF = xPathEnderecoContratado + "/ans:codigoUF";
                    Cep = xPathEnderecoContratado + "/ans:cep";

                    CodigoPrestadorNaOperadora = xPathGuia + "/ans:identificacao/ans:codigoPrestadorNaOperadora";
                    CPF = xPathGuia + "/ans:identificacao/ans:CPF";
                    CNPJ = xPathGuia + "/ans:identificacao/ans:CNPJ";
                    CNES = xPathGuia + "/ans:numeroCNES";
                }
                if (!conselhoProfissional.Equals(""))
                {
                    SiglaConselho = conselhoProfissional + "/ans:siglaConselho";
                    NumeroConselho = conselhoProfissional + "/ans:numeroConselho";
                    UFConselho = conselhoProfissional + "/ans:ufConselho";
                }
            }
        }
    }

    public class XPathCustomControlXmlMapping
    {
        #region Properties

        private string codigoPrestadorNaOperadora = "";
        public string CodigoPrestadorNaOperadora
        {
            get { return codigoPrestadorNaOperadora; }
            set { codigoPrestadorNaOperadora = value; }
        }
        private string cpf = "";
        public string CPF
        {
            get { return cpf; }
            set { cpf = value; }
        }
        private string cnpj = "";
        public string CNPJ
        {
            get { return cnpj; }
            set { cnpj = value; }
        }

        #endregion
        /// <summary>
        /// Mapeia os endereços (xPath) do mainDocumentXml de acordo com o tipo da guia e o tipo do profissional
        /// </summary>
        /// <param name="tipoGuia"></param>
        /// <param name="tipoProfissional">Profissional Solicitante OU Executante</param>
        public XPathCustomControlXmlMapping(TipoGuia tipoGuia, TipoProfissional tipoProfissional)
        {
            if (tipoProfissional != TipoProfissional.ProfissionalSolicitanteExecutante)
            {
                switch (tipoGuia)
                {
                    case TipoGuia.Consulta:
                        CPF = "/ns0:guiaConsulta[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:CPF[1]";
                        CNPJ = "/ns0:guiaConsulta[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                        CodigoPrestadorNaOperadora = "/ns0:guiaConsulta[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";
                        break;
                    case TipoGuia.SP_SADT:
                        switch (tipoProfissional)
                        {
                            case TipoProfissional.ProfissionalSolicitante:
                                CPF = "/ns0:guiaSP_SADT[1]/ns0:dadosSolicitante[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:cpf[1]";
                                CNPJ = "/ns0:guiaSP_SADT[1]/ns0:dadosSolicitante[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                                CodigoPrestadorNaOperadora = "/ns0:guiaSP_SADT[1]/ns0:dadosSolicitante[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";
                                break;
                            case TipoProfissional.ProfissionalExecutante:
                                CPF = "/ns0:guiaSP_SADT[1]/ns0:prestadorExecutante[1]/ns0:identificacao[1]/ns0:CPF[1]";
                                CNPJ = "/ns0:guiaSP_SADT[1]/ns0:prestadorExecutante[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                                CodigoPrestadorNaOperadora = "/ns0:guiaSP_SADT[1]/ns0:prestadorExecutante[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";
                                break;
                            default:
                                break;
                        }
                        break;
                    case TipoGuia.Resumo_Internação:
                        CPF = "/ns0:guiaResumoInternacao[1]/ns0:identificacaoExecutante[1]/ns0:identificacao[1]/ns0:CPF[1]";
                        CNPJ = "/ns0:guiaResumoInternacao[1]/ns0:identificacaoExecutante[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                        CodigoPrestadorNaOperadora = "/ns0:guiaResumoInternacao[1]/ns0:identificacaoExecutante[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";
                        break;
                    case TipoGuia.Honorário_Individual:
                        switch (tipoProfissional)
                        {
                            case TipoProfissional.ProfissionalSolicitante:
                                CPF = "/ns0:guiaHonorarioIndividual[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:CPF[1]";
                                CNPJ = "/ns0:guiaHonorarioIndividual[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                                CodigoPrestadorNaOperadora = "/ns0:guiaHonorarioIndividual[1]/ns0:contratado[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";
                                break;
                            case TipoProfissional.ProfissionalExecutante:
                                CPF = "/ns0:guiaHonorarioIndividual[1]/ns0:contratadoExecutante[1]/ns0:identificacao[1]/ns0:CPF[1]";
                                CNPJ = "/ns0:guiaHonorarioIndividual[1]/ns0:contratadoExecutante[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                                CodigoPrestadorNaOperadora = "/ns0:guiaHonorarioIndividual[1]/ns0:contratadoExecutante[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";
                                break;
                            default:
                                break;
                        }
                        break;
                    case TipoGuia.Odontologia:
                        CPF = "/ns0:guiaOdontologia[1]/ns0:dadosContratadoExecutante[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:CPF[1]";
                        CNPJ = "/ns0:guiaOdontologia[1]/ns0:dadosContratadoExecutante[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:CNPJ[1]";
                        CodigoPrestadorNaOperadora = "/ns0:guiaOdontologia[1]/ns0:dadosContratadoExecutante[1]/ns0:dadosContratado[1]/ns0:identificacao[1]/ns0:codigoPrestadorNaOperadora[1]";
                        break;
                    case TipoGuia.Solicitação_Internação:
                        break;
                    case TipoGuia.Solicitação_Prorrogação:
                        break;
                    case TipoGuia.Solicitação_SADT:
                        break;
                    case TipoGuia.Solicitação_Odontologia:
                    default:
                        break;
                }
            }
        }
    }

    public class DadosAutoPreencherGuia
    {
        public TipoGuia tipoGuia;
        public DadosGuia dadosGuia;
        public XPathCustomXml xPathSolicitante;
        public XPathCustomXml xPathExecutante;
        public XPathCustomControlXmlMapping xPathCustomControlSolicitante;
        public XPathCustomControlXmlMapping xPathCustomControlExecutante;

        public DadosAutoPreencherGuia(DadosGuia dados, TipoGuia tipo)
        {
            tipoGuia = tipo;
            dadosGuia = dados;
            xPathSolicitante = new XPathCustomXml(tipoGuia, TipoProfissional.ProfissionalSolicitante);
            xPathExecutante = new XPathCustomXml(tipoGuia, TipoProfissional.ProfissionalExecutante);
            xPathCustomControlSolicitante = new XPathCustomControlXmlMapping(tipoGuia, TipoProfissional.ProfissionalSolicitante);
            xPathCustomControlExecutante = new XPathCustomControlXmlMapping(tipoGuia, TipoProfissional.ProfissionalExecutante);
        }
    }

    public class ValidationInfo
    {
        private string fieldName;
        private string message;

        public string Message
        {
            get { return message; }
        }

        private ValidationEventArgs information;
        public ValidationEventArgs Information
        {
            get { return information; }
        }

        public string FieldName
        {
            get { return fieldName; }
        }

        public ValidationInfo(ValidationEventArgs args, string fieldName, string message)
        {
            this.information = args;
            this.fieldName = fieldName;
            this.message = message;
        }

        public ValidationInfo(string fieldName, string message)
        {
            this.fieldName = fieldName;
            this.message = message;
        }
    }

    public static class GetXElement
    {
        private static XNamespace xNsANS = XMLUtils.NamespaceANS;

        private static XElement procedimento()
        {
            return new XElement(xNsANS + "procedimento",
                       new XAttribute(XNamespace.Xmlns + "ans", "http://www.ans.gov.br/padroes/tiss/schemas"),
                       new XElement(xNsANS + "codigo"),
                       new XElement(xNsANS + "tipoTabela"),
                       new XElement(xNsANS + "descricao"));
        }
        private static XElement opm()
        {
            return new XElement(xNsANS + "OPM",
                       new XAttribute(XNamespace.Xmlns + "ans", "http://www.ans.gov.br/padroes/tiss/schemas"),
                       new XElement(xNsANS + "codigo"),
                       new XElement(xNsANS + "tipoTabela"),
                       new XElement(xNsANS + "descricao"));
        }
        private static XElement despesa()
        {
            return new XElement(xNsANS + "despesa",
                       new XAttribute(XNamespace.Xmlns + "ans", "http://www.ans.gov.br/padroes/tiss/schemas"),
                       new XElement(xNsANS + "codigo"),
                       new XElement(xNsANS + "tipoTabela"),
                       new XElement(xNsANS + "descricao"));
        }

        public static XElement ct_identificacaoEquipe()
        {
            XElement xNewMembro = new XElement(xNsANS + "membroEquipe",
                                    new XAttribute(XNamespace.Xmlns + "ans", "http://www.ans.gov.br/padroes/tiss/schemas"),
                                    new XElement(xNsANS + "codigoProfissional",
                                        new XElement(xNsANS + "cpf")),
                                    new XElement(xNsANS + "identificacaoProfissional",
                                        new XElement(xNsANS + "nomeExecutante"),
                                        new XElement(xNsANS + "conselhoProfissional",
                                            new XElement(xNsANS + "siglaConselho"),
                                            new XElement(xNsANS + "numeroConselho"),
                                            new XElement(xNsANS + "ufConselho")),
                                        new XElement(xNsANS + "codigoCBOS")),
                                    new XElement(xNsANS + "cpf"),
                                    new XElement(xNsANS + "posicaoProfissional"));
            return xNewMembro;
        }

        public static XElement ct_procedimentoRealizado()
        {
            XElement xNewProcedimento = new XElement(xNsANS + "procedimentos",
                                                new XAttribute(XNamespace.Xmlns + "ans", "http://www.ans.gov.br/padroes/tiss/schemas"),
                                                new XElement(xNsANS + "data"),
                                                new XElement(xNsANS + "horaInicio"),
                                                new XElement(xNsANS + "horaFim"),
                                                procedimento(),
                                                new XElement(xNsANS + "quantidadeRealizada"),
                                                new XElement(xNsANS + "viaAcesso"),
                                                new XElement(xNsANS + "tecnicaUtilizada"),
                                                new XElement(xNsANS + "reducaoAcrescimo"),
                                                new XElement(xNsANS + "valor"),
                                                new XElement(xNsANS + "valorTotal"));
            return xNewProcedimento;
        }

        public static XElement ct_procedimentoRealizadoEquipe()
        {
            XElement xNewProcedimento = ct_procedimentoRealizado();
            xNewProcedimento.AddFirst(new XElement(xNsANS + "equipe"));
            return xNewProcedimento;
        }

        public static XElement ct_procedimentoRevisao()
        {
            XElement xNewProcedimento = new XElement(xNsANS + "procedimentosRevisao",
                                                new XAttribute(XNamespace.Xmlns + "ans", "http://www.ans.gov.br/padroes/tiss/schemas"),
                                                new XElement(xNsANS + "data"),
                                                new XElement(xNsANS + "horaInicio"),
                                                new XElement(xNsANS + "horaFim"),
                                                procedimento(),
                                                new XElement(xNsANS + "quantidadeRealizada"),
                                                new XElement(xNsANS + "viaAcesso"),
                                                new XElement(xNsANS + "tecnicaUtilizada"),
                                                new XElement(xNsANS + "reducaoAcrescimo"),
                                                new XElement(xNsANS + "valor"),
                                                new XElement(xNsANS + "valorTotal"),
                                                new XElement(xNsANS + "justificativaRevisao"));
            return xNewProcedimento;
        }

        public static XElement ct_procedimentoSolicitado()
        {
            XElement xNewProcedimento = new XElement(xNsANS + "procedimentoSolicitado",
                                                new XAttribute(XNamespace.Xmlns + "ans", "http://www.ans.gov.br/padroes/tiss/schemas"),
                                                new XElement(xNsANS + "quantidadeSolicitada"),
                                                procedimento());
            return xNewProcedimento;
        }

        private static List<XElement> ct_procedimentoOdontologia()
        {
            List<XElement> xNewProcedimento = new List<XElement>();
            xNewProcedimento.Add(procedimento());
            xNewProcedimento.Add(new XElement(xNsANS + "denteRegiao",
                                    new XElement(xNsANS + "dente")));
            xNewProcedimento.Add(new XElement(xNsANS + "face"));
            xNewProcedimento.Add(new XElement(xNsANS + "quantidade"));
            xNewProcedimento.Add(new XElement(xNsANS + "quantidadeUS"));
            xNewProcedimento.Add(new XElement(xNsANS + "valor"));
            xNewProcedimento.Add(new XElement(xNsANS + "franquiaCoparticipacao"));
            return xNewProcedimento;
        }

        public static XElement ct_procedimentoOdonto()
        {
            List<XElement> xChilds = ct_procedimentoOdontologia();
            XElement xNewProcedimento = new XElement(xNsANS + "procedimentoExecutado",
                                            new XAttribute(XNamespace.Xmlns + "ans", "http://www.ans.gov.br/padroes/tiss/schemas"));
            foreach (XElement child in xChilds)
            {
                xNewProcedimento.Add(child);
            }
            xNewProcedimento.Add(new XElement(xNsANS + "dataRealizacao"));
            return xNewProcedimento;
        }

        public static XElement ct_procedimentoOdontoSolicitacao()
        {
            List<XElement> xChilds = ct_procedimentoOdontologia();
            XElement xNewProcedimento = new XElement(xNsANS + "procedimentoSolicitado",
                                            new XAttribute(XNamespace.Xmlns + "ans", "http://www.ans.gov.br/padroes/tiss/schemas"));
            foreach (XElement child in xChilds)
            {
                xNewProcedimento.Add(child);
            }
            return xNewProcedimento;
        }

        public static XElement ct_procedimentoOdontoRevisao()
        {
            List<XElement> xChilds = ct_procedimentoOdontologia();
            XElement xNewProcedimento = new XElement(xNsANS + "procedimentoExecutado",
                                            new XAttribute(XNamespace.Xmlns + "ans", "http://www.ans.gov.br/padroes/tiss/schemas"),
                                            new XElement(xNsANS + "procedimentoOdontologia"),
                                            new XElement(xNsANS + "valorTotal"),
                                            new XElement(xNsANS + "quantidadeTotalUS"),
                                            new XElement(xNsANS + "totalFranquiaCoparticipacao"),
                                            new XElement(xNsANS + "justificativaRevisado"));
            xNewProcedimento.Element("procedimentoOdontologia").Add(ct_procedimentoOdonto());
            return xNewProcedimento;
        }

        public static XElement ct_OPMUtilizada()
        {
            XElement xNewOPM = new XElement(xNsANS + "identificacaoOPM",
                                   new XAttribute(XNamespace.Xmlns + "ans", "http://www.ans.gov.br/padroes/tiss/schemas"),
                                   opm(),
                                   new XElement(xNsANS + "quantidade"),
                                   new XElement(xNsANS + "codigoBarra"),
                                   new XElement(xNsANS + "valorUnitario"),
                                   new XElement(xNsANS + "valorTotal"));
            return xNewOPM;
        }

        public static XElement ct_OPMUtilizadaRevisao()
        {
            XElement xNewOPM = new XElement(xNsANS + "OPM",
                                   new XAttribute(XNamespace.Xmlns + "ans", "http://www.ans.gov.br/padroes/tiss/schemas"),
                                   opm(),
                                   new XElement(xNsANS + "valorUnitario"),
                                   new XElement(xNsANS + "quantidade"),
                                   new XElement(xNsANS + "codigoBarra"),
                                   new XElement(xNsANS + "valorTotal"),
                                   new XElement(xNsANS + "justificativa"));
            return xNewOPM;
        }

        public static XElement ct_OPMSolicitadas()
        {
            XElement xNewOPM = new XElement(xNsANS + "OPMSolicitada",
                                   new XAttribute(XNamespace.Xmlns + "ans", "http://www.ans.gov.br/padroes/tiss/schemas"),
                                   new XElement(xNsANS + "quantidadeSolicitada"),
                                   new XElement(xNsANS + "fabricante"),
                                   new XElement(xNsANS + "valor"),
                                   opm());
            return xNewOPM;
        }

        public static XElement ct_atendimentoConsultaReapr()
        {
            XElement xNewElement = new XElement(xNsANS + "dadosAtendimento",
                                       new XAttribute(XNamespace.Xmlns + "ans", "http://www.ans.gov.br/padroes/tiss/schemas"),
                                       new XElement(xNsANS + "procedimento",
                                           new XElement(xNsANS + "codigoTabela"),
                                           new XElement(xNsANS + "codigoProcedimento"),
                                           new XElement(xNsANS + "justificativa")),
                                       new XElement(xNsANS + "tipoConsulta"),
                                       new XElement(xNsANS + "tipoSaida"),
                                       new XElement(xNsANS + "dataAtendimento"));
            return xNewElement;               
        }

        public static XElement ct_outrasDespesasRevisao()
        {
            XElement xNewElement = new XElement(xNsANS + "itensDespesas",
                                           new XAttribute(XNamespace.Xmlns + "ans", "http://www.ans.gov.br/padroes/tiss/schemas"),
                                           new XElement(xNsANS + "tipoDespesa"),
                                           new XElement(xNsANS + "dataRealizacao"),
                                           despesa(),
                                           new XElement(xNsANS + "reducaoAcrescimo"),
                                           new XElement(xNsANS + "quantidade"),
                                           new XElement(xNsANS + "valorUnitario"),
                                           new XElement(xNsANS + "valorTotal"),
                                           new XElement(xNsANS + "justificativa"));
            return xNewElement;
        }
    }

    public static class GetNodeXPath
    {
        public static string MembroEquipe(int cellIndex, int procedimentoSelecionado, List<ProcedimentoHandler> procedimentos)
        {
            string membroIndex = procedimentos[procedimentoSelecionado - 1].QuantidadeMembros.ToString();

            string nodeXpath = "";

            switch (cellIndex)
            {
                case 2:
                    nodeXpath = @"ns0:procedimentosRealizados[1]/ns0:procedimentos[" + procedimentoSelecionado.ToString() + "]/ns0:equipe[1]/ns0:membroEquipe[" + membroIndex + "]/ns0:posicaoProfissional[1]";
                    break;

                case 3:
                    nodeXpath = @"ns0:procedimentosRealizados[1]/ns0:procedimentos[" + procedimentoSelecionado.ToString() + "]/ns0:equipe[1]/ns0:membroEquipe[" + membroIndex + "]/ns0:codigoProfissional[1]/ns0:cpf[1]";
                    break;

                case 4:
                    nodeXpath = @"ns0:procedimentosRealizados[1]/ns0:procedimentos[" + procedimentoSelecionado.ToString() + "]/ns0:equipe[1]/ns0:membroEquipe[" + membroIndex + "]/ns0:identificacaoProfissional[1]/ns0:nomeExecutante[1]";
                    break;

                case 5:
                    nodeXpath = @"ns0:procedimentosRealizados[1]/ns0:procedimentos[" + procedimentoSelecionado.ToString() + "]/ns0:equipe[1]/ns0:membroEquipe[" + membroIndex + "]/ns0:identificacaoProfissional[1]/ns0:conselhoProfissional[1]/ns0:siglaConselho[1]";
                    break;

                case 6:
                    nodeXpath = @"ns0:procedimentosRealizados[1]/ns0:procedimentos[" + procedimentoSelecionado.ToString() + "]/ns0:equipe[1]/ns0:membroEquipe[" + membroIndex + "]/ns0:identificacaoProfissional[1]/ns0:conselhoProfissional[1]/ns0:numeroConselho[1]";
                    break;

                case 7:
                    nodeXpath = @"ns0:procedimentosRealizados[1]/ns0:procedimentos[" + procedimentoSelecionado.ToString() + "]/ns0:equipe[1]/ns0:membroEquipe[" + membroIndex + "]/ns0:identificacaoProfissional[1]/ns0:conselhoProfissional[1]/ns0:ufConselho[1]";
                    break;

                case 8:
                    nodeXpath = @"ns0:procedimentosRealizados[1]/ns0:procedimentos[" + procedimentoSelecionado.ToString() + "]/ns0:equipe[1]/ns0:membroEquipe[" + membroIndex + "]/ns0:cpf[1]";
                    break;

                default:
                    break;
            }

            return nodeXpath;
        }

        public static string ProcedimentoXPath(Microsoft.Office.Interop.Word.ContentControl cc, int procedimentoIndex, TipoCTProcedimento tipoCT)
        {
            string newXPath = "";
            switch (tipoCT)
            {
                case TipoCTProcedimento.ct_procedimentoRealizadoEquipe:
                    newXPath = cc.XMLMapping.XPath.Replace("procedimentos[" + (procedimentoIndex - 1).ToString() + "]", "procedimentos[" + procedimentoIndex.ToString() + "]");
                    break;
                case TipoCTProcedimento.ct_procedimentosRealizados:
                    newXPath = cc.XMLMapping.XPath.Replace("procedimentoRealizado[" + (procedimentoIndex - 1).ToString() + "]", "procedimentoRealizado[" + procedimentoIndex.ToString() + "]");
                    break;
                case TipoCTProcedimento.ct_procedimentoRevisao:
                    newXPath = cc.XMLMapping.XPath.Replace("procedimentosRevisao[" + (procedimentoIndex - 1).ToString() + "]", "procedimentosRevisao[" + procedimentoIndex.ToString() + "]");
                    break;
                case TipoCTProcedimento.ct_procedimentosSolicitados:
                    newXPath = cc.XMLMapping.XPath.Replace("procedimentoSolicitado[" + (procedimentoIndex - 1).ToString() + "]", "procedimentoSolicitado[" + procedimentoIndex.ToString() + "]");
                    break;
                case TipoCTProcedimento.ct_procedimentoOdontologia:
                    newXPath = cc.XMLMapping.XPath.Replace("procedimentoExecutado[" + (procedimentoIndex - 1).ToString() + "]", "procedimentoExecutado[" + procedimentoIndex.ToString() + "]");
                    break;
                case TipoCTProcedimento.ct_procedimentoOdontoSolicitacao:
                    newXPath = cc.XMLMapping.XPath.Replace("procedimentoSolicitado[" + (procedimentoIndex - 1).ToString() + "]", "procedimentoSolicitado[" + procedimentoIndex.ToString() + "]");
                    break;
            }
            return newXPath;
        }

        public static string OPMXPath(Microsoft.Office.Interop.Word.ContentControl cc, int OPMIndex, TipoCTOPM tipoCT)
        {
            string newXPath = "";
            switch (tipoCT)
            {
                case TipoCTOPM.ct_OPMUtilizada:
                    newXPath = cc.XMLMapping.XPath.Replace("identificacaoOPM[" + (OPMIndex - 1).ToString() + "]", "identificacaoOPM[" + OPMIndex.ToString() + "]");
                    break;
                case TipoCTOPM.ct_OPMUtilizadaRevisao:
                    newXPath = cc.XMLMapping.XPath.Replace("OPM[" + (OPMIndex - 1).ToString() + "]", "OPM[" + OPMIndex.ToString() + "]");
                    break;
                case TipoCTOPM.ct_OPMSolicitadas:
                    newXPath = cc.XMLMapping.XPath.Replace("OPMSolicitada[" + (OPMIndex - 1).ToString() + "]", "OPMSolicitada[" + OPMIndex.ToString() + "]");
                    break;
                default:
                    break;
            }
            return newXPath;
        }
    }
}
